/**
 * 
 */
package eventos;


import java.util.Enumeration;

import comunicaciones.IBuzon;
import comunicaciones.Mensaje;

import automatas.AutomataMaestro;
import automatas.Automata;


/**
 * @author Administrator
 *
 */
public class MensajeEventListenerMaestroEsclavos extends MensajeEventListener implements Runnable {

	private volatile boolean libre;
	
	/**
	 * @param automata
	 * @param hilo
	 */
	public MensajeEventListenerMaestroEsclavos(Automata automata, Thread hilo) {
		super(automata, hilo);
		// TODO Auto-generated constructor stub
		this.libre=true;
	}

	/* (non-Javadoc)
	 * @see eventos.MensajeEventListener#mensajeEventOccured(eventos.MensajeEvent)
	 */
	@Override
	public void mensajeEventOccured(MensajeEvent evt) {
		

	}
	
	public synchronized void esperarLibre(){
		AutomataMaestro a=(AutomataMaestro)automata;
		try{
			while(!a.isLibre()){
				//System.out.println("EventListener Esclavos dormido");
				this.wait(200);
				//System.out.println("EventListener Esclavos despierto");
			}
		}catch(Exception e){
			System.out.println("Error en el acceso concurrente al envio de mensajes");
			e.printStackTrace();
		}
	}
	
	public void run(){
		Mensaje m1,m2,m3;
		AutomataMaestro a = (AutomataMaestro)automata;
		System.out.println("Empiza el Listener");
		while(true){
			//m1 = automata.leerBroadcast();
			m1=automata.leerMensaje("esclavo 1");
			m2=automata.leerMensaje("esclavo 2");
			m3=automata.leerMensaje("esclavo 3");
			if(m1 == null && m2 == null && m3 == null){
				//System.out.println("null");
				try{
					Thread.sleep(100);
				}catch (InterruptedException e){
					System.out.println("Error en el event handler del Maestro.");
					e.printStackTrace();
				}
				//m=automata.leerBroadcast();
			}else{
				//System.out.println("Me ha llegado un mensaje");
				//si es alguno de los automatas que han llegado el final de la cinta
				/*boolean [] mensaje=m.getMatrizMensaje();
				if(mensaje[1]){
					System.out.println("["+m.getOrigen()+"]-->[Maestro]: he llegado al final de la cinta");
					if(m.getOrigen().equalsIgnoreCase("esclavo 1")){
						 ((AutomataMaestro)automata).setAutomata1Listo(true);
						 System.out.println("Despierto al automata 1");
					 }else if(m.getOrigen().equalsIgnoreCase("esclavo 2")){
						 ((AutomataMaestro)automata).setAutomata2Listo(true);
						 System.out.println("Despierto al automata 2");
					 }else if(m.getOrigen().equalsIgnoreCase("esclavo 3")){
						 ((AutomataMaestro)automata).setAutomata3Listo(true);
						 System.out.println("Despierto al automata 3");
					 }
				}*/
				boolean [] mensaje;
				
				if(m1 != null){
					
					mensaje = m1.getMatrizMensaje();
					//System.out.println("El mensaje del 1 vale "+mensaje);
					if(mensaje[1]){
						System.out.println("["+m1.getOrigen()+"]-->[Maestro]: he llegado al final de la cinta");
						((AutomataMaestro)automata).setAutomata1Listo(true);
						//System.out.println("Despierto al automata 1");
					}
					//System.out.println("Reenvio el mensaje al scada");
					/*try{
						a.getLista("SCADA").add(m1);
					}catch(NullPointerException e){
						System.out.println("MAESTRO PIENSA QUE SCADA ES NULL");
						e.printStackTrace();
					}*/
					this.reenviarMensaje(m1);
				}
				if(m2 != null){
					mensaje = m2.getMatrizMensaje();
					if(mensaje[1]){
						System.out.println("["+m2.getOrigen()+"]-->[Maestro]: he llegado al final de la cinta");
						((AutomataMaestro)automata).setAutomata2Listo(true);
						//System.out.println("Despierto al automata 2");
					}
					//System.out.println("Reenvio el mensaje al scada");
					/*try{
						a.getLista("SCADA").add(m2);
					}catch(NullPointerException e){
						System.out.println("MAESTRO PIENSA QUE SCADA ES NULL");
						e.printStackTrace();
					}*/
					this.reenviarMensaje(m2);
				}
				if(m3 != null){
					mensaje = m3.getMatrizMensaje();
					if(mensaje[1]){
						System.out.println("["+m3.getOrigen()+"]-->[Maestro]: he llegado al final de la cinta");
						((AutomataMaestro)automata).setAutomata3Listo(true);
						//System.out.println("Despierto al automata 3");
					}
					//System.out.println("Reenvio el mensaje al scada");
					/*try{
						a.getLista("SCADA").add(m3);
					}catch(NullPointerException e){
						System.out.println("MAESTRO PIENSA QUE SCADA ES NULL");
						e.printStackTrace();
					}*/
					this.reenviarMensaje(m3);
				}
				
					
				 
				//reenviar el mensaje al Scada.
				/*System.out.println("Reenvio el mensaje");
				try{
					a.getLista("SCADA").add(m);
				}catch(NullPointerException e){
					System.out.println("MAESTRO PIENSA QUE SCADA ES NULL");
					e.printStackTrace();
				}*/
				 
			}//fin else
		}
	}
	
	private void reenviarMensaje(Mensaje m){
		//System.out.println("reenviar mensaje: me duermo");
		AutomataMaestro a = (AutomataMaestro) automata;
		try{
			//System.out.println("reenviar mensaje: me duermo");
			this.esperarLibre();
			//System.out.println("reenviar mensaje: esperando a adquirir el mutex");
			a.setLibre(false);
			//System.out.println("reenviar mensaje: me despierto y cojo el mutx");
			a.getLista("SCADA").add(m);
			a.setLibre(true);
			//System.out.println("reenviar mensaje: deja el mutx");
		}catch(NullPointerException e){
			System.out.println("MAESTRO PIENSA QUE SCADA ES NULL");
			e.printStackTrace();
		}
	}

}
